// package sample.custom;
//
// import jakarta.servlet.http.HttpServletRequest;
// import org.springframework.lang.Nullable;
// import org.springframework.security.core.Authentication;
// import org.springframework.security.core.context.SecurityContextHolder;
// import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
// import org.springframework.security.oauth2.core.OAuth2ErrorCodes;
// import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
// import org.springframework.security.web.authentication.AuthenticationConverter;
// import org.springframework.util.LinkedMultiValueMap;
// import org.springframework.util.MultiValueMap;
// import org.springframework.util.StringUtils;
//
// import java.util.HashMap;
// import java.util.Map;
//
// public class CustomCodeGrantAuthenticationConverter implements AuthenticationConverter {
// 	@Nullable
// 	@Override
// 	public Authentication convert(HttpServletRequest request) {
// 		// grant_type (REQUIRED)
// 		String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE);
// 		if (!"urn:ietf:params:oauth:grant-type:custom_code".equals(grantType)) {
// 			return null;
// 		}
//
// 		Authentication clientPrincipal = SecurityContextHolder.getContext().getAuthentication();
//
// 		MultiValueMap<String, String> parameters = getFormParameters(request);
//
// 		// code (REQUIRED)
// 		String code = parameters.getFirst(OAuth2ParameterNames.CODE);
// 		if (!StringUtils.hasText(code) ||
// 				parameters.get(OAuth2ParameterNames.CODE).size() != 1) {
// 			throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_REQUEST);
// 		}
//
// 		Map<String, Object> additionalParameters = new HashMap<>();
// 		parameters.forEach((key, value) -> {
// 			if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) &&
// 					!key.equals(OAuth2ParameterNames.CLIENT_ID) &&
// 					!key.equals(OAuth2ParameterNames.CODE)) {
// 				additionalParameters.put(key, value.get(0));
// 			}
// 		});
//
// 		return new CustomCodeGrantAuthenticationToken(code, clientPrincipal, additionalParameters);
// 	}
//
// 	static MultiValueMap<String, String> getFormParameters(HttpServletRequest request) {
// 		Map<String, String[]> parameterMap = request.getParameterMap();
// 		MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
// 		parameterMap.forEach((key, values) -> {
// 			String queryString = StringUtils.hasText(request.getQueryString()) ? request.getQueryString() : "";
// 			// If not query parameter then it's a form parameter
// 			if (!queryString.contains(key) && values.length > 0) {
// 				for (String value : values) {
// 					parameters.add(key, value);
// 				}
// 			}
// 		});
// 		return parameters;
// 	}
//
// 	static MultiValueMap<String, String> getQueryParameters(HttpServletRequest request) {
// 		Map<String, String[]> parameterMap = request.getParameterMap();
// 		MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
// 		parameterMap.forEach((key, values) -> {
// 			String queryString = StringUtils.hasText(request.getQueryString()) ? request.getQueryString() : "";
// 			if (queryString.contains(key) && values.length > 0) {
// 				for (String value : values) {
// 					parameters.add(key, value);
// 				}
// 			}
// 		});
// 		return parameters;
// 	}
// }
